#pragma once

#include "iostream"
#include "vector"
#include "algorithm"
#include "TypeDefin.h"

using namespace std;

/*HJJ QQ479287006
 *给你二叉树的根节点 root ，返回其节点值的 锯齿形层序遍历 。（即先从左往右，再从右往左进行下一层遍历，以此类推，层与层之间交替进行）。

 

示例 1：


输入：root = [3,9,20,null,null,15,7]
输出：[[3],[20,9],[15,7]]
示例 2：

输入：root = [1]
输出：[[1]]

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */
vector<vector<int>> zigzagLevelOrder(TreeNode *root) {
    vector<vector<int>> ret;
    //如果为空
    if (root == nullptr)
        return ret;
    vector<int> tempVec;
    queue < TreeNode * > q;
    q.push(root);
    int front = 0;//queue 头
    int rear = 1; //queue 尾部
    int last = 1;//记录本层最后一个节点queue index
    int lever = 0;//层次
    while (!q.empty()) {
        TreeNode *temp = q.front();
        q.pop();
        front++;
        //对应层插入数据
        if (lever % 2 != 0)
            tempVec.emplace(tempVec.begin(), temp->val);//
        else
            tempVec.emplace_back(temp->val);//

        if (temp->left) {
            q.push(temp->left);
            rear++;//尾部+1
        }
        if (temp->right) {
            q.push(temp->right);
            rear++;//尾部+1
        }
        //说明刚好到了这一层末尾
        if (last == front) {
            last = rear;//记录末尾节点队列 index


            ret.emplace_back(tempVec);
            tempVec.clear();//清空容器
            ++lever;//层数+1
        }
    }
    return ret;
}